/**
 * 从网络获取书籍信息控制器
 * 
 * 从豆瓣书籍获取：https://book.douban.com/isbn/36294884/<isbn>
 * 
 * 所需模块支持
 * 1.Axios - 支持http/https的网络访问模块（支持node.js和Browser)
 * 2.Cheerio - 支持jQuery的工作方式进行web页面资源的读取模块
 * 
 * npm install axios
 * npm install cheerio 
 * npm install cheerio -D @types/cheerio
 * 
 * 
 * 从网络获取数据
 * 1.通过网络获取指定ISBN的页面内容信息
 * 2.进行数据的清洗、格式化
 * 3.转换输出指定的JSON对象
 */

const express = require("express");
const axios = require("axios").default;
const cheerio = require("cheerio");

const util = require("../common/util");
const config = require("../common/config");

//设置axios访问server的user-agent
const axiosConfig = {
    headers: {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.34",
    },
};

//书籍信息的结构
let bookInfo = {
    title: "", //书名
    pic: "",//图片
    author: "",//作者
    publisher: "", //出版社
    producer: "", //出品方
    subtitle: "", //副标题
    originalTitle: "", //原作名
    translator: "", //译者
    pubdate: "", //出版年
    pages: "", //页数
    price: "", //价格
    binding: "", //装帧
    series: "", //丛书
    isbn: "", //isbn
    intro: "", //内容简介
    doubanId: "", //豆瓣ID
}

/**
 *从豆瓣获取书籍信息
 * @param {express.Request} req
 * @param {express.Response} res
 */
function fetchFromDouban(req, res) {
    let isbn = req.params.isbn; //获取路由参数中的isb值
    
    let doubanUrl = config.douban.baseUrl + isbn;
    axios.get(doubanUrl, axiosConfig)
        .then((result) => {
            clearBookInfo();
            //path: '/subject/36294884/'
            bookInfo.doubanId = result.request.path.split("/")[2];//对path进行切片获取豆瓣ID
            util.log(result);
            parseDoubanBook(result.data);
            res.json(util.FormatJSONData(200, "从豆瓣获取书籍信息成功",bookInfo));
    })
    .catch((error) => {
        util.err(error);
        res.json(util.FormatJSONData(400, "从豆瓣获取书籍信息失败", { error: error }));
    });
}

/**
 * 分析豆瓣读书的书籍页面信息
 * @param {String} html -获取到的html内容 
 */
function parseDoubanBook(html){
    const $ = cheerio.load(html)

    //获取标题 获取id为wrapper 中的h1标签中的span标签
    let title = $("#wrapper h1 span").html()
    // util.log(title)
    // attr("src")获取img中src所存放的图片地址
    let pic = $("#wrapper #content #mainpic img").attr("src")
    // util.log(pic)
    //
    let info = $("#wrapper #content #info").text().trim();
    // util.log(info);
    //获取文本信息    
    let intro = $("#wrapper #content .related_info #link-report .intro").text().trim()
        .replace(/\s+/g, "\n");//正则表达式 ：/s+/g 将匹配字符串中的所有空白字符，以一个换行符来替换匹配到的空白字符。
    //  util.log(intro);
    bookInfo.title = title;
    bookInfo.pic = pic;
    bookInfo.intro = intro;

    formatInfo(info);
}

/**
 * 
 * @param {String} info - 豆瓣书籍中的·info·信息提取
 */
function formatInfo(info){
    let infoArr = [];
    info = info.split("\n")
    info.forEach(element => {
        element = element.trim();//去掉字符串两端的空格
        if(!element.match(/^[ ]*$/)){//为空格字符
            infoArr.push(element)
        }
    });

    let infoStr = infoArr.join("")
    let temp = infoStr.replace("作者:","作者:")
        .replace("出版社:", "|出版社:")
        .replace("原作名:", "|原作名:")
        .replace("副标题:", "|副标题:")
        .replace("出品方:", "|出品方:")
        .replace("译者:", "|译者:")
        .replace("出版年:", "|出版年:")
        .replace("页数:", "|页数:")
        .replace("定价:", "|定价:")
        .replace("装帧:", "|装帧:")
        .replace("丛书:", "|丛书:")
        .replace("ISBN:", "|ISBN:");
        // util.log(temp);
        let infoC = temp.split("|")
        for(let i = 0; i < infoC.length; i++){
            const element = infoC[i]
            if(element.match("作者")){
                bookInfo.author = element.split(":")[1].trim();
            }
            if (element.match("出版社")) {
                bookInfo.publisher = element.split(":")[1].trim();
            }
            if (element.match("原作名")) {
                bookInfo.originalTitle = element.split(":")[1].trim();
            }
            if (element.match("副标题")) {
                bookInfo.subtitle = element.split(":")[1].trim();
            }
            if (element.match("出品方")) {
                bookInfo.producer = element.split(":")[1].trim();
            }
            if (element.match("译者")) {
                bookInfo.translator = element.split(":")[1].trim();
            }
            if (element.match("出版年")) {
                bookInfo.pubdate = element.split(":")[1].trim();
            }
            if (element.match("页数")) {
                bookInfo.pages = element.split(":")[1].trim();
            }
            if (element.match("定价")) {
                bookInfo.price = element.split(":")[1].trim();
            }
            if (element.match("装帧")) {
                bookInfo.binding = element.split(":")[1].trim();
            }
            if (element.match("丛书")) {
                bookInfo.series = element.split(":")[1].trim();
            }
            if (element.match("ISBN")) {
                bookInfo.isbn = element.split(":")[1].trim();
            }
        }
}

/**
 * 清除全局bookInfo中的原有内容
 */
function clearBookInfo() {
    for (const key in bookInfo) {
        if (Object.hasOwnProperty.call(bookInfo, key)) {
            bookInfo[key] = "";
        }
    }
}

   module.exports = {
    fetchFromDouban,
   }